import { defineStore } from 'pinia';
import {
  mitt,
  isEmpty,
  debounce,
  isNotEmpty,
  logoutApi,
  validateTokenApi,
  initSystemApi,
  qsParse,
} from '@jecloud/utils';
import { GLOBAL_SETTINGS_TOKENKEY, buildThemeVariables, themeDefaultConfig } from '../helper';
import { useWebSocketStore } from './websocket-store';
/**
 * 系统配置
 */
export const useGlobalStore = defineStore({
  id: 'global-store',
  state() {
    return {
      appId: '',
      activeApp: {},
      currentAccount: null, // 当前账号
      systemInfo: null, // 系统数据
      tokenKey: GLOBAL_SETTINGS_TOKENKEY,
      emitter: mitt(), // 事件触发器
      locale: uni.getLocale(),
      theme: {
        basePrimaryColor: themeDefaultConfig.primaryColor, // 基础主题颜色，用于计算生成色系使用
        ...themeDefaultConfig,
      },
      pages: {
        index: '/pages/index/index',
        login: '/pages/login/login',
      },
    };
  },
  getters: {
    themeVariables(state) {
      const vars = buildThemeVariables({
        primaryColor: state.theme.basePrimaryColor,
        dark: state.theme.dark,
      });
      // 主题色
      state.theme.primaryColor = vars['--je-primary-color'];
      return vars;
    },
    themeClass(state) {
      return {
        'je-theme-gray-mode': state.theme.mode,
      };
    },
  },
  actions: {
    /**
     * 绑定子应用事件，供主应用调用
     * @param args
     */
    on(...args) {
      this.emitter.on(...args);
    },
    /**
     * 触发应用事件
     * @param args
     */
    emit(...args) {
      return this.emitter.emit(...args);
    },
    /**
     * 设置语言
     *
     * @param {*} locale
     */
    setLocale(locale) {
      this.locale = locale;
    },
    /**
     * 设置主题
     * @param {Object} theme
     * @param {String} theme.primaryColor 主题色
     * @param {Array} theme.colors 主题色值
     * @param {Boolean} theme.dark 暗色主题
     * @param {Boolean} theme.mode 灰色主题
     */
    setTheme(theme = {}) {
      const { primaryColor, loginPrimaryColor, colors, dark, mode } = theme;
      primaryColor && (this.theme.basePrimaryColor = primaryColor);
      loginPrimaryColor && (this.theme.loginPrimaryColor = loginPrimaryColor);
      colors && (this.theme.colors = colors);
      isNotEmpty(dark) && (this.theme.dark = dark);
      isNotEmpty(mode) && (this.theme.mode = mode);
    },
    /**
     * 初始化主题
     * @param {*} app
     */
    initTheme(config) {
      const app = this.activeApp;
      // 设置系统变量的主题色
      let primaryColor = config.variables?.JE_SYSTEM_PRIMARY_COLOR;
      if (primaryColor) {
        app.primaryColor = app.primaryColor || primaryColor;
      }
      // 更新主题色
      if (app.primaryColor) {
        this.theme.colors[0] = app.primaryColor;
      }
      this.setTheme(app);
    },
    /**
     * 获取token
     * @returns token
     */
    getToken() {
      return uni.getStorageSync(this.tokenKey);
    },
    /**
     * 设置token
     * @param {*} token
     */
    setToken(token) {
      if (isEmpty(token)) {
        uni.removeStorageSync(this.tokenKey);
      } else {
        uni.setStorageSync(this.tokenKey, token);
      }
    },

    /**
     * token 验证
     * @params {Object} options
     * @params {Boolean} options.api 启用api验证，默认true
     * @returns
     */
    validateToken(options = {}) {
      const { api = true } = options;
      // #ifdef H5
      // 解析h5参数authorization
      const params = qsParse(window.location.href.split('?')[1]);
      if (params[this.tokenKey]) {
        this.setToken(params[this.tokenKey]);
      }
      // #endif
      const token = this.getToken();
      if (token) {
        return api
          ? validateTokenApi()
              .then(() => {
                this.setToken(token);
                return { success: true, token };
              })
              .catch((message) => {
                // 清空token
                this.setToken();
                return Promise.reject(message);
              })
          : Promise.resolve({ success: true, token });
      }
      return Promise.reject({ success: false });
    },
    /**
     * 初始化系统信息
     * @param {*} param0
     */
    initSystem(systemInfo) {
      this.currentAccount = systemInfo.currentAccount;
      this.systemInfo = systemInfo;
    },
    /**
     * 登录
     */
    login(options = {}) {
      const { token = this.getToken(), goHome } = options;
      const indexPage = this.pages.index;
      if (token) {
        // 设置token
        this.setToken(token);
        // 初始化系统数据
        initSystemApi().then((systemInfo) => {
          this.initSystem(systemInfo);
          // 开启websocket
          useWebSocketStore().login();
          // 登录事件
          this.emit('login');
          // 跳转首页
          goHome && uni.reLaunch({ url: indexPage });
        });
      } else {
        this.logout();
      }
    },

    /**
     * 退出登录
     */
    logout: debounce(() => {
      const store = useGlobalStore();
      const token = store.getToken();
      if (token) {
        // 关闭websocket
        useWebSocketStore().logout();
        // 退出事件
        store.emit('logout');
        // 有token，先执行退出操作
        logoutApi();
      }
      // 清除token
      store.setToken();
      // 跳转登录页
      uni.reLaunch({ url: store.pages.login });

      // TODO:微应用退出操作，需要发送websocket，进行处理
    }, 100),
    /**
     * 设置应用AppID
     * @param {*} appId
     */
    setAppId(appId) {
      this.appId = appId;
    },
    /**
     * 设置app配置信息
     * @param {*} app
     */
    setAppConfig(app) {
      this.apps[app.appId] = app;
    },
    /**
     * 设置当前app配置信息
     * @param {*} app
     */
    setActiveApp(app) {
      this.setAppId(app.appId);
      this.activeApp = app;
    },
  },
});
